#ifndef __OPERAND_H__
#define __OPERAND_H__

enum
{
	OP_TYPE_REG,
	OP_TYPE_MEM,
	OP_TYPE_IMM
};

#define OP_STR_SIZE 40

typedef struct
{
	uint32_t type; // 用来表示操作数的类型
	size_t size;   // 指定了这个操作数的大小(1,2,4)
	union//根据 type 指定的类型，只会使用这四个字段中的一个。比如，如果 type 指定这是一个寄存器操作数，那么 reg 字段会被使用，而其他字段将被忽略
	{
		uint32_t reg;//用于表示寄存器编号或寄存器索引
		swaddr_t addr;//用于表示内存地址
		uint32_t imm;//有符号立即数
		int32_t simm;//无符号立即数
	};
	uint32_t val;//通常表示操作数的实际值,比如寄存器的值
	char str[OP_STR_SIZE];//这是一个字符数组，用于存储操作数的字符串表示形式
} Operand;

typedef struct
{
	uint32_t opcode;		 // 用来表示操作码
	bool is_operand_size_16; // 用于指示操作数的大小是否为 16 位
	Operand src, dest, src2;//分别表示指令的第一个源操作数、目标操作数和第二个源操作数
} Operands;

#endif
